package cn.oppexecise;

import java.io.*;
import java.util.Scanner;

/**
 * @author SWJ
 * @create 2021-06-17 18:37
 */
public class TestCopyFile2 {
    public static void main(String[] args) {
        //1.提示并接收用户输入的源文件路径和目标位置路径
        System.out.println("请输入源文件路径：");
        String f = new Scanner(System.in).nextLine();
        //--复制啥
        System.out.println("请输入目标文件路径：");
        String t = new Scanner(System.in).nextLine();
        //--复制到哪

        //2.调用使用字符流复制文件的方法，传入刚刚接收到的两个参数
        ZFCopy(f,t);
        //3.调用使用字节流复制文件的方法，传入刚刚接收到的两个参数
//        ZJCopy(f, t);
    }

    /**创建一个使用字节流复制文件的方法，注意两个参数*/
    private static void ZJCopy(String f, String t) {
        //1.定义在整个方法都生效的局部变量，注意手动初始化，值为null
        InputStream in = null;
        OutputStream out = null;
        //2.由于代码可能会抛出异常，所以需要完成try-catch-finally结构
        try {
            //3.1创建一个高效字节输入流，传入的参数是目标文件的路径
            in = new BufferedInputStream(new FileInputStream(f));
            //3.2创建一个高效字节输出流，传入的参数是目标文件复制到哪的路径
            out = new BufferedOutputStream(new FileOutputStream(t));

            //4.拿到流对象以后就可以做具体业务操作了
            //4.1定义变量用来记录读到的数据
            int b;
            //4.2使用循环读取目标文件,直到返回值为-1,没有数据时循环结束
            while ((b = in.read()) != -1) {
                //读取源文件的内容
                out.write(b);
                //将本次循环读到的内容写出到指定位置的文件中
            }
            System.out.println("恭喜您！文件复制成功！");
        } catch (Exception e) {
            System.out.println("很抱歉！文件复制失败！");
            e.printStackTrace();
        } finally {//一定会被执行到的代码需要放在finally中，比如关流操作
            /*关流是有顺序的：如果有多个流，最后创建的流最先关闭
             * 多条关流语句需要各自try-catch*/
            try {
                out.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                in.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    //创建一个使用字符流复制文件的方法,注意：复制需要两个流对象
    private static void ZFCopy(String f, String t) {
        //1.定义在整个方法都生效的局部变量，注意手动初始化，值为null
        Reader in = null;
        Writer out = null;
        //2.由于代码可能会抛出异常，所以需要完成try-catch-finally结构
        try {
            //3.1创建一个高效字符输入流，传入的参数是目标文件的路径
            in = new BufferedReader(new FileReader(f));
            //3.2创建一个高效字符输出流，传入的参数是目标文件复制到哪的路径
            out = new BufferedWriter(new FileWriter(t));

            //4.拿到流对象以后就可以做具体业务操作了
            //4.1定义变量用来记录读到的数据
            int b;
            //4.2使用循环读取目标文件,直到返回值为-1,没有数据时循环结束
            while ((b = in.read()) != -1) {//读取源文件的内容
                out.write(b);//将本次循环读到的内容写出到指定位置的文件中
            }
            System.out.println("恭喜您！文件复制成功！");
        } catch (Exception e) {
            System.out.println("很抱歉！文件复制失败！");
            e.printStackTrace();
        } finally {//一定会被执行到的代码需要放在finally中，比如关流操作
            /*关流是有顺序的：如果有多个流，最后创建的流最先关闭
             * 多条关流语句需要各自try-catch*/
            try {
                out.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                in.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}